import {ComponentOptions} from "vue";
import {deepClone} from "../utils";

const SelectObjectMixin2: ComponentOptions = {
  data() {
    return {
      tableData: [] as any[],
      selectData: [] as any[],
    }
  },
  methods: {
    /**
     * 判断行数据是否相等，
     * 这个需要重写
     */
    tableDataEqualsSelectData(tableItem: any, selectItem: any) {
      console.error('tableDataEqualsSelectData这个一定要重写')
      console.log('tableDataEqualsSelectData需要重写')
      return false;
    },
    /**
     * 表格数据更新了，通知回显，
     * 这个直接调用
     */
    tableDataUpdate() {
      this.selectData2TableData()
    },
    /**
     * 表格回显，
     * 直接调用
     */
    selectData2TableData() {
      this.tableData.forEach((t, ti) => {
        let selectFind = this.selectData.find((s, si) => {
          return this.tableDataEqualsSelectData(t, s)
        })
        if (selectFind) {
          let clone = deepClone(selectFind);
          // 复制回显
          this.tableData[ti] = clone
          this.tableDataIsSelectCall(clone, ti, true)
        } else {
          this.tableDataIsSelectCall(t, ti, false)
        }
      })
    },
    /**
     * 表格回显勾选回调
     * 需要重写
     */
    tableDataIsSelectCall(tableItem, tableIndex, selected) {

    },
    /**
     * 选中数据有更新，
     * 这个直接调用
     */
    selectRowUpdate(selectItem: any, selectIndex: number) {
      let findIndex = this.tableData.findIndex(i => this.tableDataEqualsSelectData(i, selectItem))
      if (findIndex > -1) { // 这里是找到了
        this.selectRowUpdateCall(this.tableData[findIndex], findIndex, selectItem, selectIndex)
      } else { // 这里是没有找到，不然update的是否使用回调无法知道是否需要添加数据到select或者移除
        this.selectRowUpdateCall(null, findIndex, selectItem, selectIndex)
      }
    },
    /**
     * 选中数据有更新通知表格，
     * 这个需要重写
     */
    selectRowUpdateCall(tableItem: any | null, tableIndex: number, selectItem: any, selectIndex: number) {

    },
    /**
     * 表格数据有更新，
     * 这个直接调用
     */
    tableRowUpdate(tableItem: any, tableIndex: number) {
      let findIndex = this.selectData.findIndex(i => this.tableDataEqualsSelectData(tableItem, i))
      if (findIndex > -1) { // 这里是找到了
        this.tableRowUpdateCall(this.selectData[findIndex], findIndex, tableItem, tableIndex)
      } else { // 这里是没有找到，不然update的是否使用回调无法知道是否需要添加数据到select或者移除
        this.tableRowUpdateCall(null, findIndex, tableItem, tableIndex)
      }
    },
    /**
     * 表格数据有更新通知选中数据，
     * 这个需要重写
     */
    tableRowUpdateCall(selectItem: any | null, selectIndex: number, tableItem: any, tableIndex: number) {

    },
    /**
     * 添加多个数据到选中
     */
    addTableData2SelectData(tableItems = []) {
      tableItems.forEach(i => {
        this.addTableRow2SelectData(i)
      })
    },
    /**
     * 表格数据添加选中数据，
     * 这个直接调用
     */
    addTableRow2SelectData(tableItem) {
      let tableIndex = this.tableData.findIndex(i => this.tableDataEqualsSelectData(tableItem, i))
      let findIndex = this.selectData.findIndex(i => this.tableDataEqualsSelectData(tableItem, i))
      if (findIndex === -1) {
        this.selectData.push(deepClone(tableItem))
      }
      this.tableDataIsSelectCall(tableItem, tableIndex, true)
    },
    /**
     * 清除多个数据到选中
     */
    clearTableData2SelectData(tableItems = []) {
      tableItems.forEach(i => {
        this.clearTableRow2SelectData(i)
      })
    },
    /**
     * 表格直接清除数据，
     * 这个直接调用
     */
    clearTableRow2SelectData(tableItem) {
      let tableIndex = this.tableData.findIndex(i => this.tableDataEqualsSelectData(tableItem, i))
      let findIndex = this.selectData.findIndex(i => this.tableDataEqualsSelectData(tableItem, i))
      if (findIndex > -1) {
        let selectItem = this.selectData.splice(findIndex, 1)[0]
        this.clearTableRow2SelectDataCall(tableItem, tableIndex, selectItem, findIndex)
      } else {
        this.clearTableRow2SelectDataCall(tableItem, tableIndex, null, findIndex)
      }
      this.tableDataIsSelectCall(tableItem, tableIndex, false)
    },
    /**
     * 表格清除回调
     * 这个可以重写
     * selectItem不一定有值
     */
    clearTableRow2SelectDataCall(tableItem, tableIndex, selectItem, findIndex) {

    },
    /**
     * 清除选中数据到表格数据，
     * 这个直接调用
     */
    clearSelectRow2TableData(selectItem) {
      let selectIndex = this.selectData.findIndex(i => this.tableDataEqualsSelectData(i, selectItem))
      let tableIndex = this.tableData.findIndex(i => this.tableDataEqualsSelectData(i, selectItem))
      if (tableIndex > -1) {
        const tableItem = this.tableData[tableIndex];
        this.clearSelectRow2TableDataCall(selectItem, selectIndex, tableItem, tableIndex)
        this.tableDataIsSelectCall(tableItem, tableIndex, false)
      } else {
        this.clearSelectRow2TableDataCall(selectItem, selectIndex, null, tableIndex)
      }
      this.selectData.splice(selectIndex, 1)
    },
    /**
     * 表格清除回调
     * 这个可以重写
     * tableItem不一定有值
     */
    clearSelectRow2TableDataCall(selectItem: any, selectIndex: number, tableItem: any | null, tableIndex: number) {

    },
    /**
     * 清除多个选中的数据
     */
    clearSelectData2TableData(selectItems = []) {
      selectItems.forEach(s => {
        this.clearSelectRow2TableData(s)
      })
    },
    clearSelectDataAll2TableData() {
      this.clearSelectData2TableData(this.selectData)
      this.selectData = []
    }
  }
}

export default SelectObjectMixin2
























